#include <stdio.h>/*该文件包含pringtf()等函数*/
#include <stdlib.h>/*该文件包含exit()等函数*/
#include <malloc.h>/*该文件包含malloc()等函数*/

#define QUEUE_MAX_SIZE 100 // 栈最多支持存放100个数据元素

typedef struct Queue {
  int elements[QUEUE_MAX_SIZE];
  int size;
} Queue;

// 初始化队列。初始化成功返回0；初始化失败返回1。
int init_queue(Queue ** q){
    *q = malloc(sizeof(Queue));
    /* todo: 加一个判断
     * 如果动态内存分配失败，则返回1
     */
    if(!(*q)) return 1;

    (*q)->size = 0;

    return 0;
}


// 在队列q的尾巴上增加一个元素，其值为value。增加成功，返回0；增加失败，返回1
int enqueue (Queue * q, int value){

    if((q->size)>=QUEUE_MAX_SIZE) return 1;
    else{
        q->elements[q->size ] = value;
       ( q->size)++;
        return 0;
    }

}

// 从队列q上摘取（去掉）一个元素，将其值放入value中。摘取成功，返回0；摘取失败，返回1。
int dequeue(Queue * q, int *value){
if((q->size) >= 0){
    int a = q->size;
    *value = q->elements[0];
    for(int i =0;i<q->size;i++){
        q ->elements[i-1] =  q ->elements[i];

    }
    (q->size)--;

    return 0;

}else{
    return 1;
}



}

// 获取队列q的第一个元素，但是并不去掉该元素，并将该值放入value中。获取成功返回0；获取失败，返回1。 
int first(Queue * q, int * value) {
if((q->size)>=0){
    *value = q -> elements[0];
    return 1;
}else{
    return 0;
}

}

// 判断队列q是否为空。为空，返回0；不为空，返回1。 
int isEmpty(Queue * q){
    if(q->size) return 1;
    else return 0;
}

// 返回队列q中的元素个数。 
int size(Queue * q){
    return q->size;

}
void main() {
    printf("OK");
    Queue * q;
    int value;


    init_queue(&q);

    for(int i=1; i<=QUEUE_MAX_SIZE; i++) {
        enqueue(q, i);

    }

    printf("队列中应当有 %d 个元素；实际上有 %d 个元素。\n", QUEUE_MAX_SIZE, size(q));

    int res = enqueue(q, 101);
    printf("在已经添加了100个元素以后，再次添加一个元素，返回值应该是1，表示新增元素失败。实际值为:%d\n", res);

    first(q, &value);
    printf("第一个元素值应该是 1；实际上是 %d\n", value);


    for(int i=1; i<=QUEUE_MAX_SIZE; i++) {
        dequeue(q, &value);
        // printf("第%d个元素的值应该是 %d；实际值是: %d\n", i, value);
        printf("第%d个元素的值应该是 %d；实际值是: %d\n", i, i, value);
    }

    if(isEmpty(q) == 0) {
        printf("恭喜！现在队列里没有元素了！\n");
    } else {
        printf("啊！我的代码有问题！\n");
    }
}
